package com.rem.chat.common.utils;

import com.rem.chat.common.constants.Constants;
import com.rem.chat.pojo.request.SysSettingSaveRequest;
import com.rem.chat.pojo.response.SystemSettingResponse;
import com.rem.chat.service.dto.UserLoginDTO;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * @author: Themberfue
 * @date: 2025/6/4 19:38
 * @description:
 */
@Component
public class RedisComponent {
    @Resource
    RedisUtil redisUtil;

    /**
     * 获取用户心跳
     * @param userId 用户 id
     * @return 用户心跳
     */
    public String getUserHeartBeat(String userId) {
        return redisUtil.get(Constants.REDIS_KEY_WS_USER_HEART_BEAT + userId);
    }

    /**
     * 设置用户心跳
     * @param userId 用户 id
     */
    public void saveUserHeartBeat(String userId) {
        redisUtil.set(Constants.REDIS_KEY_WS_USER_HEART_BEAT + userId,
                String.valueOf(System.currentTimeMillis()),
                60L);
    }

    /**
     * 移除用户心跳
     * @param userId 用户id
     */
    public void removeUserHeartBeat(String userId) {
        redisUtil.delete(Constants.REDIS_KEY_WS_USER_HEART_BEAT + userId);
    }

    /**
     * 保存用户信息
     * @param userLoginDTO 用户登录请求
     */
    public void saveTokenUserInfo(UserLoginDTO userLoginDTO) {
        String val = JacksonUtil.writeValueAsString(userLoginDTO);
        redisUtil.set(Constants.REDIS_KEY_WS_TOKEN + userLoginDTO.getToken(),
                val,
            Constants.REDIS_KEY_EXPIRES_DAY * 2);

        redisUtil.set(Constants.REDIS_KEY_WS_TOKEN_USERID + userLoginDTO.getUserId(),
                userLoginDTO.getToken(),
                Constants.REDIS_KEY_EXPIRES_DAY * 2);
    }

    /**
     * 通过 token 获取用户信息
     * @param token 用户token
     * @return 用户信息
     */
    public UserLoginDTO getUserInfoByToken(String token) {
        String val = redisUtil.get(Constants.REDIS_KEY_WS_TOKEN + token);
        return val == null ? null : JacksonUtil.readValue(val, UserLoginDTO.class);
    }

    /**
     * 根据 userId 获取用户信息
     * @param userId 用户id
     * @return 用户信息
     */
    public UserLoginDTO getUserInfoByUserId(String userId) {
        String token = redisUtil.get(Constants.REDIS_KEY_WS_TOKEN_USERID + userId);
        return JacksonUtil.readValue(
                redisUtil.get(Constants.REDIS_KEY_WS_TOKEN + token),
                UserLoginDTO.class);
    }

    /**
     * 删除用户token
     * @param userId 用户id
     */
    public void removeUserToken(String userId) {
        String token = redisUtil.get(Constants.REDIS_KEY_WS_TOKEN_USERID + userId);
        if (!StringUtils.hasText(token)) {
            return;
        }
        redisUtil.delete(Constants.REDIS_KEY_WS_TOKEN + token,
                Constants.REDIS_KEY_WS_TOKEN_USERID + userId);
    }

    /**
     * 保存用户联系人列表
     * @param userId 用户id
     * @param contactList 联系人列表
     */
    public void saveUserContactList(String userId, List<String> contactList) {
        redisUtil.delete(Constants.REDIS_KEY_USER_CONTACT + userId);
        redisUtil.lPushAll(Constants.REDIS_KEY_USER_CONTACT + userId,
                contactList,
                Constants.REDIS_KEY_EXPIRES_DAY * 2);
    }

    /**
     * 保存用户联系人
     * @param userId 用户id
     * @param contactId 联系人id
     */
    public void saveUserContact(String userId, String contactId) {
        redisUtil.lPushAll(Constants.REDIS_KEY_USER_CONTACT + userId,
                List.of(contactId),
                Constants.REDIS_KEY_EXPIRES_DAY * 2);
    }

    /**
     * 获取用户联系人列表
     * @param userId 用户id
     * @return 联系人列表
     */
    public List<String> getUserContactList(String userId) {
        return redisUtil.getList(Constants.REDIS_KEY_USER_CONTACT + userId);
    }

    /**
     * 移除用户联系人
     * @param userId 用户id
     * @param contactId 联系人id
     */
    public void removeUserContact(String userId, String contactId) {
        redisUtil.deleteEle(Constants.REDIS_KEY_USER_CONTACT + userId, contactId);
    }

    /**
     * 获取系统设置
     * @return 系统设置
     */
    public SystemSettingResponse getSystemSetting() {
        String val = redisUtil.get(Constants.REDIS_KEY_SYSTEM_SETTING);
        // Step 1. 查询缓存是否有系统设置
        if (StringUtils.hasLength(val)) {
            return JacksonUtil.readValue(val, SystemSettingResponse.class);
        }

        // Step 2. 返回默认系统设置
        return new SystemSettingResponse();
    }

    /**
     * 保存系统设置
     * @param request 系统设置请求
     * @return 系统设置
     */
    public SystemSettingResponse saveSysSetting(SysSettingSaveRequest request) {
        redisUtil.set(Constants.REDIS_KEY_SYSTEM_SETTING,
                JacksonUtil.writeValueAsString(request));
        return BeanTransUtil.transToSystemSettingResponse(request);
    }
}
